home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2000 March / maximum-cd-2000-03.iso / Quake3 Game Source / Q3AGameSource.exe / Main / ui_addbots.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-01-18  |  10.7 KB  |  393 lines

  1. // Copyright (C) 1999-2000 Id Software, Inc.
  2. //
  3. /*
  4. =======================================================================
  5.  
  6. ADD BOTS MENU
  7.  
  8. =======================================================================
  9. */
  10.  
  11.  
  12. #include "ui_local.h"
  13.  
  14.  
  15. #define ART_BACK0            "menu/art/back_0"
  16. #define ART_BACK1            "menu/art/back_1"    
  17. #define ART_FIGHT0            "menu/art/accept_0"
  18. #define ART_FIGHT1            "menu/art/accept_1"
  19. #define ART_BACKGROUND        "menu/art/addbotframe"
  20. #define ART_ARROWS            "menu/art/arrows_vert_0"
  21. #define ART_ARROWUP            "menu/art/arrows_vert_top"
  22. #define ART_ARROWDOWN        "menu/art/arrows_vert_bot"
  23.  
  24. #define ID_BACK                10
  25. #define ID_GO                11
  26. #define ID_LIST                12
  27. #define ID_UP                13
  28. #define ID_DOWN                14
  29. #define ID_SKILL            15
  30. #define ID_TEAM                16
  31. #define ID_BOTNAME0            20
  32. #define ID_BOTNAME1            21
  33. #define ID_BOTNAME2            22
  34. #define ID_BOTNAME3            23
  35. #define ID_BOTNAME4            24
  36. #define ID_BOTNAME5            25
  37. #define ID_BOTNAME6            26
  38.  
  39.  
  40. typedef struct {
  41.     menuframework_s    menu;
  42.     menubitmap_s    arrows;
  43.     menubitmap_s    up;
  44.     menubitmap_s    down;
  45.     menutext_s        bots[7];
  46.     menulist_s        skill;
  47.     menulist_s        team;
  48.     menubitmap_s    go;
  49.     menubitmap_s    back;
  50.  
  51.     int                numBots;
  52.     int                delay;
  53.     int                baseBotNum;
  54.     int                selectedBotNum;
  55.     int                sortedBotNums[MAX_BOTS];
  56.     char            botnames[7][32];
  57. } addBotsMenuInfo_t;
  58.  
  59. static addBotsMenuInfo_t    addBotsMenuInfo;
  60.  
  61.  
  62. /*
  63. =================
  64. UI_AddBotsMenu_FightEvent
  65. =================
  66. */
  67. static void UI_AddBotsMenu_FightEvent( void* ptr, int event ) {
  68.     const char    *team;
  69.     int            skill;
  70.  
  71.     if (event != QM_ACTIVATED) {
  72.         return;
  73.     }
  74.  
  75.     team = addBotsMenuInfo.team.itemnames[addBotsMenuInfo.team.curvalue];
  76.     skill = addBotsMenuInfo.skill.curvalue + 1;
  77.  
  78.     trap_Cmd_ExecuteText( EXEC_APPEND, va("addbot %s %i %s %i\n",
  79.         addBotsMenuInfo.botnames[addBotsMenuInfo.selectedBotNum], skill, team, addBotsMenuInfo.delay) );
  80.  
  81.     addBotsMenuInfo.delay += 1500;
  82. }
  83.  
  84.  
  85. /*
  86. =================
  87. UI_AddBotsMenu_BotEvent
  88. =================
  89. */
  90. static void UI_AddBotsMenu_BotEvent( void* ptr, int event ) {
  91.     if (event != QM_ACTIVATED) {
  92.         return;
  93.     }
  94.  
  95.     addBotsMenuInfo.bots[addBotsMenuInfo.selectedBotNum].color = color_orange;
  96.     addBotsMenuInfo.selectedBotNum = ((menucommon_s*)ptr)->id - ID_BOTNAME0;
  97.     addBotsMenuInfo.bots[addBotsMenuInfo.selectedBotNum].color = color_white;
  98. }
  99.  
  100.  
  101. /*
  102. =================
  103. UI_AddBotsMenu_BackEvent
  104. =================
  105. */
  106. static void UI_AddBotsMenu_BackEvent( void* ptr, int event ) {
  107.     if (event != QM_ACTIVATED) {
  108.         return;
  109.     }
  110.     UI_PopMenu();
  111. }
  112.  
  113.  
  114. /*
  115. =================
  116. UI_AddBotsMenu_SetBotNames
  117. =================
  118. */
  119. static void UI_AddBotsMenu_SetBotNames( void ) {
  120.     int            n;
  121.     const char    *info;
  122.  
  123.     for ( n = 0; n < 7; n++ ) {
  124.         info = UI_GetBotInfoByNumber( addBotsMenuInfo.sortedBotNums[addBotsMenuInfo.baseBotNum + n] );
  125.         Q_strncpyz( addBotsMenuInfo.botnames[n], Info_ValueForKey( info, "name" ), sizeof(addBotsMenuInfo.botnames[n]) );
  126.     }
  127.  
  128. }
  129.  
  130.  
  131. /*
  132. =================
  133. UI_AddBotsMenu_UpEvent
  134. =================
  135. */
  136. static void UI_AddBotsMenu_UpEvent( void* ptr, int event ) {
  137.     if (event != QM_ACTIVATED) {
  138.         return;
  139.     }
  140.  
  141.     if( addBotsMenuInfo.baseBotNum > 0 ) {
  142.         addBotsMenuInfo.baseBotNum--;
  143.         UI_AddBotsMenu_SetBotNames();
  144.     }
  145. }
  146.  
  147.  
  148. /*
  149. =================
  150. UI_AddBotsMenu_DownEvent
  151. =================
  152. */
  153. static void UI_AddBotsMenu_DownEvent( void* ptr, int event ) {
  154.     if (event != QM_ACTIVATED) {
  155.         return;
  156.     }
  157.  
  158.     if( addBotsMenuInfo.baseBotNum + 7 < addBotsMenuInfo.numBots ) {
  159.         addBotsMenuInfo.baseBotNum++;
  160.         UI_AddBotsMenu_SetBotNames();
  161.     }
  162. }
  163.  
  164.  
  165. /*
  166. =================
  167. UI_AddBotsMenu_GetSortedBotNums
  168. =================
  169. */
  170. static int QDECL UI_AddBotsMenu_SortCompare( const void *arg1, const void *arg2 ) {
  171.     int            num1, num2;
  172.     const char    *info1, *info2;
  173.     const char    *name1, *name2;
  174.  
  175.     num1 = *(int *)arg1;
  176.     num2 = *(int *)arg2;
  177.  
  178.     info1 = UI_GetBotInfoByNumber( num1 );
  179.     info2 = UI_GetBotInfoByNumber( num2 );
  180.  
  181.     name1 = Info_ValueForKey( info1, "name" );
  182.     name2 = Info_ValueForKey( info2, "name" );
  183.  
  184.     return Q_stricmp( name1, name2 );
  185. }
  186.  
  187. static void UI_AddBotsMenu_GetSortedBotNums( void ) {
  188.     int        n;
  189.  
  190.     // initialize the array
  191.     for( n = 0; n < addBotsMenuInfo.numBots; n++ ) {
  192.         addBotsMenuInfo.sortedBotNums[n] = n;
  193.     }
  194.  
  195.     qsort( addBotsMenuInfo.sortedBotNums, addBotsMenuInfo.numBots, sizeof(addBotsMenuInfo.sortedBotNums[0]), UI_AddBotsMenu_SortCompare );
  196. }
  197.  
  198.  
  199. /*
  200. =================
  201. UI_AddBotsMenu_Draw
  202. =================
  203. */
  204. static void UI_AddBotsMenu_Draw( void ) {
  205.     UI_DrawBannerString( 320, 16, "ADD BOTS", UI_CENTER, color_white );
  206.     UI_DrawNamedPic( 320-233, 240-166, 466, 332, ART_BACKGROUND );
  207.  
  208.     // standard menu drawing
  209.     Menu_Draw( &addBotsMenuInfo.menu );
  210. }
  211.  
  212.     
  213. /*
  214. =================
  215. UI_AddBotsMenu_Init
  216. =================
  217. */
  218. static const char *skillNames[] = {
  219.     "I Can Win",
  220.     "Bring It On",
  221.     "Hurt Me Plenty",
  222.     "Hardcore",
  223.     "Nightmare!",
  224.     0
  225. };
  226.  
  227. static const char *teamNames1[] = {
  228.     "Free",
  229.     0
  230. };
  231.  
  232. static const char *teamNames2[] = {
  233.     "Red",
  234.     "Blue",
  235.     0
  236. };
  237.  
  238. static void UI_AddBotsMenu_Init( void ) {
  239.     int        n;
  240.     int        y;
  241.     int        gametype;
  242.     int        count;
  243.     char    info[MAX_INFO_STRING];
  244.  
  245.     trap_GetConfigString(CS_SERVERINFO, info, MAX_INFO_STRING);   
  246.     gametype = atoi( Info_ValueForKey( info,"g_gametype" ) );
  247.  
  248.     memset( &addBotsMenuInfo, 0 ,sizeof(addBotsMenuInfo) );
  249.     addBotsMenuInfo.menu.draw = UI_AddBotsMenu_Draw;
  250.     addBotsMenuInfo.menu.fullscreen = qfalse;
  251.     addBotsMenuInfo.menu.wrapAround = qtrue;
  252.     addBotsMenuInfo.delay = 1000;
  253.  
  254.     UI_AddBots_Cache();
  255.  
  256.     addBotsMenuInfo.numBots = UI_GetNumBots();
  257.     count = addBotsMenuInfo.numBots < 7 ? addBotsMenuInfo.numBots : 7;
  258.  
  259.     addBotsMenuInfo.arrows.generic.type  = MTYPE_BITMAP;
  260.     addBotsMenuInfo.arrows.generic.name  = ART_ARROWS;
  261.     addBotsMenuInfo.arrows.generic.flags = QMF_INACTIVE;
  262.     addBotsMenuInfo.arrows.generic.x     = 200;
  263.     addBotsMenuInfo.arrows.generic.y     = 128;
  264.     addBotsMenuInfo.arrows.width           = 64;
  265.     addBotsMenuInfo.arrows.height           = 128;
  266.  
  267.     addBotsMenuInfo.up.generic.type        = MTYPE_BITMAP;
  268.     addBotsMenuInfo.up.generic.flags    = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
  269.     addBotsMenuInfo.up.generic.x        = 200;
  270.     addBotsMenuInfo.up.generic.y        = 128;
  271.     addBotsMenuInfo.up.generic.id        = ID_UP;
  272.     addBotsMenuInfo.up.generic.callback = UI_AddBotsMenu_UpEvent;
  273.     addBotsMenuInfo.up.width              = 64;
  274.     addBotsMenuInfo.up.height              = 64;
  275.     addBotsMenuInfo.up.focuspic         = ART_ARROWUP;
  276.  
  277.     addBotsMenuInfo.down.generic.type      = MTYPE_BITMAP;
  278.     addBotsMenuInfo.down.generic.flags    = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
  279.     addBotsMenuInfo.down.generic.x          = 200;
  280.     addBotsMenuInfo.down.generic.y          = 128+64;
  281.     addBotsMenuInfo.down.generic.id          = ID_DOWN;
  282.     addBotsMenuInfo.down.generic.callback = UI_AddBotsMenu_DownEvent;
  283.     addBotsMenuInfo.down.width            = 64;
  284.     addBotsMenuInfo.down.height            = 64;
  285.     addBotsMenuInfo.down.focuspic         = ART_ARROWDOWN;
  286.  
  287.     for( n = 0, y = 120; n < count; n++, y += 20 ) {
  288.         addBotsMenuInfo.bots[n].generic.type        = MTYPE_PTEXT;
  289.         addBotsMenuInfo.bots[n].generic.flags        = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
  290.         addBotsMenuInfo.bots[n].generic.id            = ID_BOTNAME0 + n;
  291.         addBotsMenuInfo.bots[n].generic.x            = 320 - 56;
  292.         addBotsMenuInfo.bots[n].generic.y            = y;
  293.         addBotsMenuInfo.bots[n].generic.callback    = UI_AddBotsMenu_BotEvent;
  294.         addBotsMenuInfo.bots[n].string                = addBotsMenuInfo.botnames[n];
  295.         addBotsMenuInfo.bots[n].color                = color_orange;
  296.         addBotsMenuInfo.bots[n].style                = UI_LEFT|UI_SMALLFONT;
  297.     }
  298.  
  299.     y += 12;
  300.     addBotsMenuInfo.skill.generic.type        = MTYPE_SPINCONTROL;
  301.     addBotsMenuInfo.skill.generic.flags        = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
  302.     addBotsMenuInfo.skill.generic.x            = 320;
  303.     addBotsMenuInfo.skill.generic.y            = y;
  304.     addBotsMenuInfo.skill.generic.name        = "Skill:";
  305.     addBotsMenuInfo.skill.generic.id        = ID_SKILL;
  306.     addBotsMenuInfo.skill.itemnames            = skillNames;
  307.     addBotsMenuInfo.skill.curvalue            = Com_Clamp( 0, 4, (int)trap_Cvar_VariableValue( "g_spSkill" ) - 1 );
  308.  
  309.     y += SMALLCHAR_HEIGHT;
  310.     addBotsMenuInfo.team.generic.type        = MTYPE_SPINCONTROL;
  311.     addBotsMenuInfo.team.generic.flags        = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
  312.     addBotsMenuInfo.team.generic.x            = 320;
  313.     addBotsMenuInfo.team.generic.y            = y;
  314.     addBotsMenuInfo.team.generic.name        = "Team: ";
  315.     addBotsMenuInfo.team.generic.id            = ID_TEAM;
  316.     if( gametype >= GT_TEAM ) {
  317.         addBotsMenuInfo.team.itemnames        = teamNames2;
  318.     }
  319.     else {
  320.         addBotsMenuInfo.team.itemnames        = teamNames1;
  321.         addBotsMenuInfo.team.generic.flags    = QMF_GRAYED;
  322.     }
  323.  
  324.     addBotsMenuInfo.go.generic.type            = MTYPE_BITMAP;
  325.     addBotsMenuInfo.go.generic.name            = ART_FIGHT0;
  326.     addBotsMenuInfo.go.generic.flags        = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
  327.     addBotsMenuInfo.go.generic.id            = ID_GO;
  328.     addBotsMenuInfo.go.generic.callback        = UI_AddBotsMenu_FightEvent;
  329.     addBotsMenuInfo.go.generic.x            = 320+128-128;
  330.     addBotsMenuInfo.go.generic.y            = 256+128-64;
  331.     addBotsMenuInfo.go.width                  = 128;
  332.     addBotsMenuInfo.go.height                  = 64;
  333.     addBotsMenuInfo.go.focuspic                = ART_FIGHT1;
  334.  
  335.     addBotsMenuInfo.back.generic.type        = MTYPE_BITMAP;
  336.     addBotsMenuInfo.back.generic.name        = ART_BACK0;
  337.     addBotsMenuInfo.back.generic.flags        = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
  338.     addBotsMenuInfo.back.generic.id            = ID_BACK;
  339.     addBotsMenuInfo.back.generic.callback    = UI_AddBotsMenu_BackEvent;
  340.     addBotsMenuInfo.back.generic.x            = 320-128;
  341.     addBotsMenuInfo.back.generic.y            = 256+128-64;
  342.     addBotsMenuInfo.back.width                = 128;
  343.     addBotsMenuInfo.back.height                = 64;
  344.     addBotsMenuInfo.back.focuspic            = ART_BACK1;
  345.  
  346.     addBotsMenuInfo.baseBotNum = 0;
  347.     addBotsMenuInfo.selectedBotNum = 0;
  348.     addBotsMenuInfo.bots[0].color = color_white;
  349.  
  350.     UI_AddBotsMenu_GetSortedBotNums();
  351.     UI_AddBotsMenu_SetBotNames();
  352.  
  353.     Menu_AddItem( &addBotsMenuInfo.menu, &addBotsMenuInfo.arrows );
  354.  
  355.     Menu_AddItem( &addBotsMenuInfo.menu, &addBotsMenuInfo.up );
  356.     Menu_AddItem( &addBotsMenuInfo.menu, &addBotsMenuInfo.down );
  357.     for( n = 0; n < count; n++ ) {
  358.         Menu_AddItem( &addBotsMenuInfo.menu, &addBotsMenuInfo.bots[n] );
  359.     }
  360.     Menu_AddItem( &addBotsMenuInfo.menu, &addBotsMenuInfo.skill );
  361.     Menu_AddItem( &addBotsMenuInfo.menu, &addBotsMenuInfo.team );
  362.     Menu_AddItem( &addBotsMenuInfo.menu, &addBotsMenuInfo.go );
  363.     Menu_AddItem( &addBotsMenuInfo.menu, &addBotsMenuInfo.back );
  364. }
  365.  
  366.  
  367. /*
  368. =================
  369. UI_AddBots_Cache
  370. =================
  371. */
  372. void UI_AddBots_Cache( void ) {
  373.     trap_R_RegisterShaderNoMip( ART_BACK0 );
  374.     trap_R_RegisterShaderNoMip( ART_BACK1 );
  375.     trap_R_RegisterShaderNoMip( ART_FIGHT0 );
  376.     trap_R_RegisterShaderNoMip( ART_FIGHT1 );
  377.     trap_R_RegisterShaderNoMip( ART_BACKGROUND );
  378.     trap_R_RegisterShaderNoMip( ART_ARROWS );
  379.     trap_R_RegisterShaderNoMip( ART_ARROWUP );
  380.     trap_R_RegisterShaderNoMip( ART_ARROWDOWN );
  381. }
  382.  
  383.  
  384. /*
  385. =================
  386. UI_AddBotsMenu
  387. =================
  388. */
  389. void UI_AddBotsMenu( void ) {
  390.     UI_AddBotsMenu_Init();
  391.     UI_PushMenu( &addBotsMenuInfo.menu );
  392. }
  393.